package com.team.databoard.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.team.databoard.common.ErrorCode;
import com.team.databoard.exception.BusinessException;
import com.team.databoard.mapper.UserMapper;
import com.team.databoard.model.User;
import com.team.databoard.service.UserService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import static com.team.databoard.constant.UserConstant.ADMIN_ROLE;
import static com.team.databoard.constant.UserConstant.USER_LOGIN_STATE;

/**
 * @author guojing2003
 * @description 针对表【user】的数据库操作Service实现
 * @createDate 2024-08-23 22:03:41
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements UserService {

    @Resource
    private UserMapper userMapper;

    /**
     * 盐值
     */
    private static final String SALT = "databoard";

    /**
     * 用户登录
     *
     * @param userName 用户名
     * @param password 密码
     * @param request  请求
     * @return 登录是否成功
     */
    @Override
    public boolean login(String userName, String password, HttpServletRequest request) {
        // 判断用户名是否存在
        if (!userExist(userName)) {
            return false;
        }
        QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
        queryWrapper.eq("user_name", userName);
        // 查询用户
        User user = userMapper.selectOne(queryWrapper);
        // 密码加密
        String encryptPassword = encryptPassword(password);
        if (!encryptPassword.equals(user.getPassword())) {
            return false;
        }
        user.setPassword(null);
        // 登录成功，将用户信息存入session
        request.getSession().setAttribute(USER_LOGIN_STATE, user);
        return true;
    }

    /**
     * 新增用户
     *
     * @param userName 用户名
     * @param password 密码
     * @return 插入是否成功
     */
    @Override
    public int insertUser(String userName, String password, int role) {
        // 判断用户名是否已经存在
        if (userExist(userName)) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户名已存在");
        }
        // 密码加密
        String encryptPassword = encryptPassword(password);
        User user = new User();
        user.setUserName(userName);
        user.setPassword(encryptPassword);
        user.setRole(role);
        if (this.save(user)) {
            return user.getId();
        } else {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "新增用户失败");
        }
    }

    /**
     * 删除用户
     *
     * @param id 用户id
     *           return 删除是否成功
     */
    @Override
    public boolean deleteUser(int id) {
        // 判断用户名是否存在
        if (this.getById(id) == null) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户不存在");
        }
        return this.removeById(id);
    }

    /**
     * 更新用户
     *
     * @param id       用户id
     * @param userName 用户名
     * @param password 密码
     * @param role     角色
     * @return 更新是否成功
     */
    @Override
    public boolean updateUser(int id, String userName, String password, int role) {
        // 判断用户是否存在
        if (this.getById(id) == null) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户不存在");
        }
        // 判断用户名是否已经存在
        if (!this.getById(id).getUserName().equals(userName) && userExist(userName)) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户名已存在");
        }
        User user = new User();
        user.setId(id);
        user.setUserName(userName);
        user.setPassword(password);
        user.setRole(role);
        return this.updateById(user);
    }

    /**
     * 加密密码
     *
     * @param password 密码
     * @return 加密后的密码
     */
    @Override
    public String encryptPassword(String password) {
        return DigestUtils.md5DigestAsHex((password + SALT).getBytes());
    }

    /**
     * 判断用户是否存在
     *
     * @param userName 用户名
     * @return 是否存在
     */
    private boolean userExist(String userName) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
        queryWrapper.eq("user_name", userName);
        long count = userMapper.selectCount(queryWrapper);
        return count > 0;
    }

    /**
     * 初始化管理员
     */
    @PostConstruct
    public void init() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
        queryWrapper.eq("role", ADMIN_ROLE);
        // 初始化管理员，保证至少有一个管理员
        if (userMapper.selectCount(queryWrapper) == 0) {
            insertUser("admin", "123456", 1);
        }
    }
}




